package com.example.demo.leetcode;

import java.util.*;

/**
 * 出现次数最多的单词,但不能在banned数组中
 * 答案唯一
 * 不区分大小写 ，答案应以 小写 形式返回。
 * 输入：paragraph = "Bob hit a ball, the hit BALL flew far after it was hit.", banned = ["hit"]
 * 输出："ball"
 * 解释：
 * "hit" 出现了 3 次，但它是禁用词。
 * "ball" 出现了两次（没有其他单词出现这么多次），因此它是段落中出现频率最高的非禁用词。
 * 请注意，段落中的单词不区分大小写，
 * 标点符号会被忽略（即使它们紧挨着单词，如 "ball,"），
 * 并且尽管 "hit" 出现的次数更多，但它不能作为答案，因为它是禁用词。
 */
public class Leetcode819 {

    public String mostCommonWord(String param, String[] banned) {
        String[] words = param.trim().toLowerCase().split("[^A-Za-z]+");
        // 统计每个出现的次数
        Map<String, Integer> wc = new HashMap<>();
        Set<String> set = new HashSet<>(Arrays.asList(banned));
        for (String s : words) {
            if (!set.contains(s)) {
                if (wc.containsKey(s.toLowerCase())) {
                    wc.put(s.toLowerCase(), wc.get(s.toLowerCase()) + 1);
                } else {
                    wc.put(s.toLowerCase(), 1);
                }
            }
        }
//        int max = 0;
//        for (Map.Entry<String, Integer> entry : wc.entrySet()) {
//            max = Math.max(max, entry.getValue());
//        }
//
//        for (Map.Entry<String, Integer> entry : wc.entrySet()) {
//            if (entry.getValue().equals(max)) {
//                return entry.getKey();
//            }
//        }
        return wc.entrySet().stream().max(Comparator.comparingInt(Map.Entry::getValue)).map(Map.Entry::getKey).orElse(null);
    }

    public String mostCommonWord2(String paragraph, String[] banned) {
        // 转换为小写并去除标点符号（这里简单地只保留字母和数字）
        // a, a, a, a, b,b,b,c, c没法通过
       /* StringBuilder sb = new StringBuilder();
        for (char c : paragraph.toCharArray()) {
            if (Character.isLetterOrDigit(c)) {
                sb.append(Character.toLowerCase(c));
            } else if (Character.isWhitespace(c)) {
                sb.append(' '); // 保留单词之间的空格
            }
        }
        */


        // 拆分成单词列表
        String[] words = paragraph.trim().toLowerCase().split("[^A-Za-z]+");

        // 禁用词集合，方便快速查找
        Set<String> bannedSet = new HashSet<>(Arrays.asList(banned));

        // 统计单词频率
        Map<String, Integer> wordCount = new HashMap<>();
        for (String word : words) {
            if (!bannedSet.contains(word)) {
                wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
            }
        }

        // 找到频率最高的单词
        String mostCommon = "";
        int maxCount = 0;
        for (Map.Entry<String, Integer> entry : wordCount.entrySet()) {
            if (entry.getValue() > maxCount) {
                maxCount = entry.getValue();
                mostCommon = entry.getKey();
            }
        }

        return mostCommon;
    }

    public static void main(String[] args) {
        Leetcode819 solution = new Leetcode819();
        String paragraph = "Bob hit a ball, the hit BALL flew far after it was hit.";
        String[] banned = {"hit"};
        System.out.println(solution.mostCommonWord(paragraph, banned)); // 输出 "ball"

        paragraph = "a, a, a, a, b,b,b,c, c";
        banned = new String[]{"a"};
        System.out.println(solution.mostCommonWord(paragraph, banned)); // 输出 "a"
    }

}
